package ke03;

import java.util.ArrayList;
import java.util.List;

public class Ueberweisung implements Runnable {

	private static long idCounter = 0;

	private final long id;
	private final Konto absender;
	private final Konto empfaenger;
	private final int betrag;

	private static List<Konto> aktiveKonten = new ArrayList<Konto>();

	public Ueberweisung(Konto absender, Konto empfaenger, int betrag) {
		this.id = ++idCounter;
		this.absender = absender;
		this.empfaenger = empfaenger;
		this.betrag = betrag;
	}

	@Override
	public void run() {

		synchronized (aktiveKonten) {
			while (aktiveKonten.contains(absender)
					|| aktiveKonten.contains(empfaenger)) {
				try {
					aktiveKonten.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			aktiveKonten.add(absender);
			aktiveKonten.add(empfaenger);
		}

		synchronized (absender) {
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (empfaenger) {
				System.out.println("Starte Überweisung " + id + "...");
				absender.setKtoStand(absender.getKtoStand() - betrag);
				empfaenger.setKtoStand(empfaenger.getKtoStand() + betrag);
				System.out.println("Überweisung " + id + " durchgeführt.");
			}
		}

		synchronized (aktiveKonten) {
			aktiveKonten.remove(absender);
			aktiveKonten.remove(empfaenger);
			aktiveKonten.notifyAll();
		}
	}

}
